/**
 * @author 徐楠
 * @date 2022/3/29 21:20
 * @version 1.0
 */

package com.xunan.likou;

import java.util.ArrayList;
import java.util.List;

/**
 * 螺旋矩阵
 */
public class SpiralMatrix {
    public static void main(String[] args) {
        int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        List<Integer> list = spiralOrder(matrix);
        for (Integer integer : list) {
            System.out.println(integer);
        }
    }

    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        if (matrix == null || matrix.length == 0)
            return list;
        //列长
        int m = matrix.length;
        //行长
        int n = matrix[0].length;
        int i = 0;

        //统计矩阵从外向内的层数，如果矩阵非空，那么它的层数至少为1层
        int count = (Math.min(m, n) + 1) / 2;
        //从外部向内部遍历，逐层打印数据
        while (i < count) {
            //第 1 个：从左向右
            for (int j = i; j < n - i; j++) {
                list.add(matrix[i][j]);
            }
            //第 2 个：从上往下
            for (int j = i + 1; j < m - i; j++) {
                list.add(matrix[j][(n - 1) - i]);
            }
            //第 3 个：从右往左，如果这一层只有1行，那么第一个循环已经将该行打印了,，这里就不需要打印了即 （m-1-i ）!= i
            for (int j = (n - 1) - (i + 1); j >= i && (m - 1 - i) != i; j--) {
                list.add(matrix[(m - 1) - i][j]);
            }
            //第4个：从下往上，如果这一层只有1列，那么第2个循环已经将该列打印了，这里不需要打印，即(n-1-i) != i
            for (int j = (m - 1) - (i + 1); j >= i + 1 && (n - 1 - i) != i; j--) {
                list.add(matrix[j][i]);
            }
            i++;
        }
        return list;
    }
}
